﻿Imports Lourdes.BackEnd.BC
Imports Lourdes.BackEnd.Interfaces
Imports Lourdes.BackEnd.View
Imports Lourdes.BackEnd.Modelo
Imports Lourdes.BackEnd
Imports Microsoft.Reporting.WinForms
Imports System.Collections.Specialized
Imports System.Configuration
Public Class frmFactura
  Private _ViewFacturacion As vFacturacion
  Private _FacturaId As Integer?

  Public WriteOnly Property FacturaId() As Integer?
    Set(ByVal value As Integer?)
      _FacturaId = value
    End Set
  End Property


  Public Sub New()

    ' Llamada necesaria para el diseñador.
    InitializeComponent()

    ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
    _ViewFacturacion = New vFacturacion

  End Sub

  Private Sub ucBuscadorPersonas_PersonaSeleccionada(ByRef pPersona As Persona) Handles ucBuscadorPersonas.PersonaSeleccionada
    Dim bcPer As BC_Persona
    Try
      bcPer = New BC_Persona
      If bcPer.DeudaDentroLimite(pPersona.PersonaId) Then
        If MessageBox.Show("El cliente seleccionado presenta una deuda mayor a su límite permitido. ¿Desea continuar con la operación?", _
                        "Advertencia", _
                        MessageBoxButtons.YesNo) = DialogResult.No Then
          Me.Close()
          Me.Dispose()
        End If
      End If
      UcObraSocialSelector1.CargarCliente(pPersona.PersonaId)
      UcPersonaImpuestos1.CargarCondicionIVACliente(pPersona.PersonaId)
    Catch ex As Exception
      Utils.ManejoErrores(ex)
    End Try
  End Sub

  Private Sub UcProductosGridFactura1_MercaderiaSelectorInitialize()
    UcProductosGridFactura1.ListaPrecioId = UcObraSocialSelector1.getListaPrecioSeleccionada
  End Sub

  Private Sub frmFactura_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    If Keys.F2 = e.KeyCode And btnGuardar.Enabled = True Then
      btnGuardar_Click(Nothing, Nothing)
    ElseIf Keys.F3 = e.KeyCode And btnNuevo.Enabled = True Then
      btnNuevo_Click(Nothing, Nothing)
    ElseIf Keys.F4 = e.KeyCode And btnLogistica.Enabled = True Then
      btnLogistica_Click(Nothing, Nothing)
    ElseIf Keys.Escape = e.KeyCode And btnCancelar.Enabled = True Then
      btnCancelar_Click(Nothing, Nothing)
    ElseIf Keys.F5 = e.KeyCode And btnPagar.Enabled = True Then
      btnPagar_Click(Nothing, Nothing)
    ElseIf Keys.F6 = e.KeyCode And btnImprimir.Enabled = True Then
      btnImprimir_Click(Nothing, Nothing)
    ElseIf Keys.F7 = e.KeyCode And btnRemito.Enabled = True Then
      btnRemito_Click(Nothing, Nothing)
    End If
  End Sub

  Private Sub frmFactura_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ConfigurarControles()

    'TotalMostrar(0)
    ''se manda ese valor para bloquear el control hasta que no se seleccione el cliente.
    'UcObraSocialSelector1.CargarCliente(Nothing)
    'UcPersonaImpuestos1.CargarCondicionIVACliente(Nothing)
    ''hasta que no se genera un número de factura no se puede utilizar la logistica.
    'btnLogistica.Enabled = False
  End Sub

  Private Sub ConfigurarControles()
    If _FacturaId.HasValue Then
      _ViewFacturacion.getvFacturacion(_FacturaId)
      With _ViewFacturacion.Cabecera.FacturaBase
        TotalMostrar(.TotalNeto)
        ucBuscadorPersonas.CargarCliente(.ClientePerId)
        UcObraSocialSelector1.CargarCliente(.ClientePerId, .PlanMedicoId)
        UcPersonaImpuestos1.CargarCondicionIVACliente(.ClientePerId)
        UcFormaPago1.CargarFormaDePago(_ViewFacturacion.Cabecera)
      End With

      UcProductosGridFactura1.Productos = _ViewFacturacion.Productos
      FacturaSoloLectura()

    Else
      TotalMostrar(0)
      UcObraSocialSelector1.CargarCliente(Nothing)
      UcPersonaImpuestos1.CargarCondicionIVACliente(Nothing)
      btnLogistica.Enabled = False
    End If

    'SetListaDePrecios()

  End Sub

  'Private Sub SetListaDePrecios()
  '  Dim ListaPrecioId As Integer?

  '  ListaPrecioId = UcObraSocialSelector1.getListaPrecioSeleccionada()

  '  If ListaPrecioId.HasValue Then
  '    UcProductosGridFactura1.ListaPrecioId = ListaPrecioId
  '  Else
  '    UcProductosGridFactura1.ListaPrecioId = ConfigurationManager.AppSettings("ListaPrecioBaseId")
  '  End If

  'End Sub
  Private Sub Save()

    Dim frmNrosSerie As frmNumerosDeSerie
    Try
      If ValidateData() Then
        ControlsToView()

        If VerificarStockProductos(_ViewFacturacion.Productos) Then
          frmNrosSerie = New frmNumerosDeSerie(_ViewFacturacion.Productos)
          frmNrosSerie.ShowDialog(Me)
        End If

      End If
    Catch ex As Exception
      Utils.ManejoErrores(ex)
    End Try
  End Sub
  Private Function VerificarStockProductos(pProductos As vLstProductos) As Boolean
    For Each Producto As vProducto In pProductos
      If Producto.CantidadStock > 0 Then
        Return True
      End If
    Next
    Return True
  End Function

  Public Sub GuardarFactura(Optional pProductos As vLstProductos = Nothing)
    Dim iFactId As Integer
    Dim iDocId As Integer

    If pProductos IsNot Nothing Then
      _ViewFacturacion.Productos = pProductos
    End If

    iFactId = _ViewFacturacion.Insert()
    iDocId = BC_Documento.GetIdDoc(iFactId, Enums.DocumentoTipo.Factura)
    UcFormaPago1.Save(iDocId)
    MostrarMensajeStatusBar("Factura generada correctamente, con el número: " & iFactId, Color.Green, Color.White, 3000)

    ' se genero la factura por lo tanto hay elementos que ya no se pueden modificar.
    FacturaSoloLectura()
  End Sub
  Private Sub FacturaSoloLectura()
    UcProductosGridFactura1.SetMode(Enums.TipoABM.Modificacion)
    btnGuardar.Enabled = False
    ucBuscadorPersonas.Enabled = False
    UcFormaPago1.Enabled = False
    UcObraSocialSelector1.Enabled = False
    UcPersonaImpuestos1.Enabled = False
    btnLogistica.Enabled = True
    btnImprimir.Enabled = True
    btnPagar.Enabled = True
    btnRemito.Enabled = True
    btnCancelar.Text = "Salir (Esc)"
  End Sub

  Private Sub FacturaAlta()
    UcProductosGridFactura1.SetMode(Enums.TipoABM.Alta)
    btnGuardar.Enabled = True
    ucBuscadorPersonas.Enabled = True
    UcFormaPago1.Enabled = True
    UcObraSocialSelector1.Enabled = True
    UcPersonaImpuestos1.Enabled = True
    btnLogistica.Enabled = False
    btnImprimir.Enabled = False
    btnPagar.Enabled = False
    btnRemito.Enabled = False
    btnCancelar.Text = "Cancelar (Esc)"
  End Sub

  Private Sub ControlsToView()
    Try

      With _ViewFacturacion.Cabecera
        .FechaFacturacion = UcFormaPago1.FechaFacturacion
        With .FacturaBase
          .ClientePerApellido = ucBuscadorPersonas.ClienteSeleccionado.Apellido
          .ClientePerNombre = ucBuscadorPersonas.ClienteSeleccionado.Nombre
          .ClientePerId = ucBuscadorPersonas.ClienteSeleccionado.PersonaId
          .Descuentos = 0
          .Estado = Enums.FacturaEstados.Pagada
          .EsVenta = True
          .FechaVencimiento = Now
          .FormaPagoId = UcFormaPago1.FormaPago
          .GastosAdicionales = 0
          ' .Impuestos = 0
          .TotalBruto = 0
          .TotalNeto = 0
          .VendedorPerId = Singletons.getPersonaVendedor.PersonaId
          .PlanMedicoId = UcObraSocialSelector1.getPlanSeleccionado
        End With
      End With
      _ViewFacturacion.Productos = UcProductosGridFactura1.Productos

    Catch ex As Exception
      Throw ex
    End Try
  End Sub

  Private Function ValidateData() As Boolean
    If Not ucBuscadorPersonas.HasClienteSeleccionado Then
      MostrarMensajeStatusBar("Debe seleccionar un cliente.", Color.Red, Color.White, 3000, Media.SystemSounds.Exclamation)
      Return False
    End If

    If UcProductosGridFactura1.Productos.Count = 0 Then
      MostrarMensajeStatusBar("Debe seleccionar al menos un producto.", Color.Red, Color.White, 3000, Media.SystemSounds.Exclamation)
      Return False
    End If

    Return True
  End Function

  Private Sub ViewToControls()

  End Sub


  Private Sub TotalMostrar(ByVal pMontoTotal As Double)
    Dim objCulture As Globalization.NumberFormatInfo = New Globalization.CultureInfo("ES-AR").NumberFormat
    'Uno a uno cambiamos las propiedades de ese formato (en este caso estamos repitiendo valores por defecto para la demostración)
    With objCulture
      .CurrencyDecimalDigits = 1
      .CurrencyDecimalSeparator = ","
      .CurrencyGroupSeparator = "."
      .CurrencyNegativePattern = 1
    End With
    lblTotal.Text = pMontoTotal.ToString("Total: $ ###,##0.##", objCulture) & ".-"
    'Response.Write(NumberToPrint.ToString("C", objCulture))
  End Sub

  Private Sub tBarValidacion_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tBarValidacion.Tick
    OcultarMensajeStatusBar()
  End Sub

  Public Sub MostrarMensajeStatusBar(ByVal pMensaje As String, ByVal pColorFondo As Color, ByVal pColorLetra As Color, Optional ByVal pTiempoDisplay As Integer = 2000, Optional ByVal pSonido As Media.SystemSound = Nothing)
    With UltraStatusBar1
      .Text = pMensaje
      .Appearance.BackColor = pColorFondo
      .Appearance.ForeColor = pColorLetra
      .Visible = True
    End With
    With tBarValidacion
      .Enabled = True
      .Interval = pTiempoDisplay
    End With
    If pSonido IsNot Nothing Then
      pSonido.Play()
    End If
  End Sub

  Private Sub OcultarMensajeStatusBar()
    With UltraStatusBar1
      .Visible = False
    End With
    With tBarValidacion
      .Enabled = False
    End With
  End Sub

  Private Sub btnGuardar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGuardar.Click
    Me.Save()
  End Sub

  Private Sub btnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNuevo.Click
    If MsgBox("¿Desea Continuar? Toda la información no guardada se perderá.", vbYesNo, "Nueva Factura") = MsgBoxResult.Yes Then
      LimpiarForm()
    End If
  End Sub

  Private Sub LimpiarForm()
    ucBuscadorPersonas.LimpiarBuscador()
    UcObraSocialSelector1.CargarCliente(Nothing)
    UcProductosGridFactura1.LimpiarUCProductos()
    UcFormaPago1.MontoTotal = 0
    UcFormaPago1.LimpiarUCFormaDePago()
    UcPersonaImpuestos1.CargarCondicionIVACliente(Nothing)
    TotalMostrar(0)
    FacturaAlta()
    'Throw New Exception("funcion no implementada")
  End Sub

  Private Sub btnCancelar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
    If MsgBox("¿Desea salir? Toda la información no guardada se perdera.", vbYesNo, "Salir de Factura") = vbYes Then
      Me.Dispose()
      Me.Close()
    End If
  End Sub

  Private Sub btnLogistica_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogistica.Click
    LogisticaMostrar()
  End Sub

  Private Sub LogisticaMostrar()
    Dim objFrmLog As New frmLogistica(_ViewFacturacion.Cabecera.FacturaBase.FacturaId, False)

    'objFrmLog.LoadLogisticaFromFactura(_ViewFacturacion.Cabecera.FacturaBase.FacturaId)
    objFrmLog.ShowDialog(Me)

  End Sub

  Private Sub btnPagar_Click(sender As System.Object, e As System.EventArgs) Handles btnPagar.Click
    Dim formulario As New frmPago(_ViewFacturacion.Cabecera.FacturaBase.DocId)
    formulario.Show(Me)
  End Sub

  Private Sub btnImprimir_Click(sender As System.Object, e As System.EventArgs) Handles btnImprimir.Click
    Utils.ShowReport(Enums.ReporteTipos.Factura, "FacturaId", _ViewFacturacion.Cabecera.FacturaBase.FacturaId, Me)
  End Sub

  Private Sub UcObraSocialSelector1_ListaPrecioSeleccionada(pListaDePrecioId As Integer?) Handles UcObraSocialSelector1.ListaPrecioSeleccionada

    If pListaDePrecioId.HasValue Then
      UcProductosGridFactura1.ListaPrecioId = pListaDePrecioId
    Else
      UcProductosGridFactura1.ListaPrecioId = ConfigurationManager.AppSettings("ListaPrecioBaseId")
    End If

  End Sub

  Private Sub btnRemito_Click(sender As System.Object, e As System.EventArgs) Handles btnRemito.Click
    Dim frmRemito As New frmGenerarRemito(_ViewFacturacion.Cabecera.FacturaBase.FacturaId)
    frmRemito.ShowDialog(Me)
  End Sub

  
  Private Sub UcProductosGridFactura1_MontoTotalActualizado_1(pMontoTotal As System.Double) Handles UcProductosGridFactura1.MontoTotalActualizado
    Me.Text = "Total: $" & Math.Round(pMontoTotal + (pMontoTotal * Me.UcPersonaImpuestos1.Alicuota / 100), 2).ToString
    _ViewFacturacion.Cabecera.FacturaBase.Impuestos = ((pMontoTotal * Me.UcPersonaImpuestos1.Alicuota) / 100)
    UcFormaPago1.MontoTotal = pMontoTotal + (pMontoTotal * Me.UcPersonaImpuestos1.Alicuota) / 100
    TotalMostrar(pMontoTotal + (pMontoTotal * Me.UcPersonaImpuestos1.Alicuota) / 100)
  End Sub
End Class

